(PYTHON) Day - 26 Numpy

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


HackerRank

드디어 파이썬 끝냈다!!

fin


Numpy

Arrays


문제 : float형 원소들을 가지는 numpy 배열을 만드는 문제
입력 : 배열에 들어갈 원소들
출력 : 원소들을 거꾸로 출력하며 float형으로 바꾼다

input
1 2 3 4 -8 -10 
input
[-10. -8. 4. 3. 2. 1.] 

numpy.array() 안에서 타입 변환이 가능하다

import numpy

def arrays(arr):
return (numpy.array(arr[::-1], float))

arr = input().strip().split(' ')
result = arrays(arr)
print(result)

Shape and Reshape


문제 : 배열의 구조를 바꾸는 문제
입력 : 9개의 정수들
출력 : 3x3 구조로 배열을 수정

input
1 2 3 4 5 6 7 8 9 
output
[[1 2 3]
[4 5 6]
[7 8 9]]

numpy.shape() 함수를 사용하면 원본 배열을 수정하게 된다

import numpy

my_array = numpy.array([int(n) for n in input().split()])
my_array.shape = (3, 3)
print(my_array)

하지만 numpy.reshape() 함수는 새로운 배열을 만들기 때문에 원본 데이터를 건드리지 않는다

import numpy

my_array = numpy.array([int(n) for n in input().split()])
print(my_array.reshape(3, 3))

Transpose and Flatten


문제 : 전치 행렬(transpose)과 다차원을 1차원으로 반환하는(flatten) 문제
입력 : 행렬 크기 N, M; 행렬 입력;
출력 : transpose array; flatten;

input
2 2
1 2
3 4
input
[[1 3]
[2 4]]
[1 2 3 4]
import numpy

N, M = input().split()
my*array = numpy.array([input().split() for * in range(int(N))], int)

print(my_array.transpose())
print(my_array.flatten())

Concatenate


문제 : concatenate 함수를 사용해 NxP 행렬과 MxP 행렬을 합치는 문제
입력 : N, M, P; NxP 행렬; MxP 행렬;
출력 : (N + M) * P 크기의 행렬을 출력

input
4 3 2
1 2
1 2
1 2
1 2
3 4
3 4
3 4
input
[[1 2]
[1 2]
[1 2]
[1 2]
[3 4]
[3 4]
[3 4]]

axis=0 을 기준으로 합친다

import numpy

N, M, P = input().split()
N*array = numpy.array([input().split() for * in range(int(N))], int)
M*array = numpy.array([input().split() for * in range(int(M))], int)

print(numpy.concatenate((N_array, M_array), axis=0))

Zeros and Ones


문제 : 영행렬과 1로 채운 행렬을 구하는 문제
입력 : 행렬의 크기
출력 : numpy.zeros; numpy.ones;

input
3 3 3 
input
[[[0 0 0]
[0 0 0]
[0 0 0]]

[[0 0 0]
[0 0 0]
[0 0 0]]

[[0 0 0]
[0 0 0]
[0 0 0]]]
[[[1 1 1]
[1 1 1]
[1 1 1]]

[[1 1 1]
[1 1 1]
[1 1 1]]

[[1 1 1]
[1 1 1]
[1 1 1]]]

tuple로 묶어서 shape로 정리하는 것이 깔끔함

import numpy

shape = tuple(map(int, input().split()))
print(numpy.zeros(shape, int))
print(numpy.ones(shape, int))

Eye and Identity


문제 : 주 대각 원소들(main diagonal elements)이 1인 단위행렬을 구하는 문제
입력 : 행렬의 크기 N, M;
주의 : identity 함수는 정방행렬(행과 열의 크기가 같음)에 사용된다. 즉, 여기서는 eye 함수를 사용

input
3 3 
output
[[1.  0.  0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]

numpy 출력할 때 공백이 하나 더 있어서 프린트 옵션을 추가하지 않으면 오류 처리됨

import numpy

N, M = map(int, input().split())
numpy.set_printoptions(sign=' ')
print(numpy.eye(N, M))

Array Mathematics


문제 : 사칙연산 결과를 구하는 문제
입력 : 행렬의 크기 N, M; (NxM 크기의)행렬 A; (NxM 크기의)행렬 B;
출력 : +, -, *, /, %, ** 의 결과를 차례로 출력

input
1 4
1 2 3 4
5 6 7 8
output
[[6  8 10 12]]
[[-4 -4 -4 -4]]
[[5 12 21 32]]
[[0 0 0 0]]
[[1 2 3 4]]
[[1 64 2187 65536]]

나눗셈은 그냥 divide()가 아닌 floor_divide() 사용해야함

import numpy

N, M = input().split()
A = numpy.array([input().split() for _ in range(int(N))], int)
B = numpy.array([input().split() for _ in range(int(N))], int)

print(numpy.add(A, B))
print(numpy.subtract(A, B))
print(numpy.multiply(A, B))
print(numpy.floor_divide(A, B))
print(numpy.mod(A, B))
print(numpy.power(A, B))

Linear Algebra


문제 : 행렬식을 구하는 문제
입력 : 행렬 크기 N; NxN 크기의 행렬;
출력 : 행렬식(determinant)

input
2
1.1 1.1
1.1 1.1
output
0.0 

legacy 를 1.13으로 변경해 줘야한다

import numpy

n = int(input())
a = numpy.array([input().split() for _ in range(n)],float)

numpy.set_printoptions(legacy='1.13')
print(numpy.linalg.det(a))